pmap这个指令是用来查看进程占用的内存及使用地址空间。
常使用的选项为 -d ,如下查看进程 (pid为24030)的内存使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| pmap -d 24030 24030: /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf Address Kbytes Mode Offset Device Mapping 0000000000400000 6444 r-x-- 0000000000000000 008:00002 php-cgi 0000000000c4b000 272 rw--- 000000000064b000 008:00002 php-cgi 0000000000c8f000 52 rw--- 0000000000c8f000 000:00000 [ anon ] 00000000059dc000 9572 rw--- 00000000059dc000 000:00000 [ anon ] 0000003519000000 508 r-x-- 0000000000000000 008:00002 libfreetype.so.6.3.10 000000351907f000 2048 ----- 000000000007f000 008:00002 libfreetype.so.6.3.10 中间部分省略 00002b757df75000 4 rw--- 000000000000a000 008:00002 libnss_files-2.5.so 00002b757df76000 32768 rw-s- 0000000000000000 000:00008 zero (deleted) 00002b7580685000 4 rw-s- 0000000000000000 000:00008 zero (deleted) 00007fff2e126000 476 rwx-- 00007fff2e126000 000:00000 [ stack ] 00007fff2e19d000 8 rw--- 00007fff2e19d000 000:00000 [ anon ] ffffffffff600000 8192 ----- 0000000000000000 000:00000 [ anon ] mapped: 139548K writeable/private: 12344K shared: 32772K
|
每列的含义如下:
- Address: 进程所占的地址空间
- Kbytes 该虚拟段的大小
- Mode 权限:r=read, w=write, x=execute, s=shared, p=private(copy on write)
- Mapping: bash 对应的映像文件名.要看的是最后一行的值
- mapped 表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz
- writeable/private 表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小
- shared 表示进程和其他进程共享的内存大小
Linux 会把一些shared libraries 载入到内存中,在pmap 的输出中,这些shared libraries 的名字通常是 lib*.so ,如 libX11.so.6.2.0 。
这个 libX11.so.6.2.0 会被很多process load 到自己的运行环境中,同时,ps 输出的RSS 结果中,每个process 都包含了这个libX11.so.6.2.0 ,而事实上它只被load 了一次,如果单纯把ps 的结果相加,这样就重复计算了。
看pmap输出的结果,其实php-cgi 单纯进程所占的内存是这个writeable/private: 12344K